package service;

import java.util.List;

import persistencia.AdministradorPersistencia;
import persistencia.dao.OrdenCompraDAO;
import bean.ItemOrdenCompra;
import bean.Producto;
import bean.Proveedor;
import bean.RemitoProveedor;
import bean.vo.ItemRemitoVO;
import bean.vo.ProductoVO;
import bean.vo.RemitoProveedorVO;
import bean.vo.RodamientoVO;

public class ServiciosRemitoProveedor {

	protected static RemitoProveedor buscarRemitoProveedor(String cuitProveedor, Integer numeroRemito) throws Exception {
		Proveedor prov = ServiciosProveedor.buscarProveedor(cuitProveedor);
		if (prov == null){
			throw new Exception("ERROR - No existe un proveedor con el cuit ingresado");
		}
		
		RemitoProveedor rem = (RemitoProveedor) SistemaCVR.getInstancia().buscarEntidad(new RemitoProveedor(numeroRemito, prov));
		return rem;
	}
	
	public static RemitoProveedorVO buscarRemitoProveedor(RemitoProveedorVO r) throws Exception {
		RemitoProveedor rem = ServiciosRemitoProveedor.buscarRemitoProveedor(r.getProveedor().getCuit(), r.getNumeroRemito());
		return rem != null ? rem.getVO() : null;
	}
	
	public static void crearRemitoProveedor(RemitoProveedorVO r) throws Exception {
		String cuitProveedor = r.getProveedor().getCuit();
		Integer numeroRemito = r.getNumeroRemito();
		
		if (cuitProveedor == null || numeroRemito == null)
			throw new Exception("ERROR - Cuit y numero de remito son requeridos.");
		
		Proveedor prov = ServiciosProveedor.buscarProveedor(cuitProveedor);
		if (prov == null){
			throw new Exception("ERROR - No existe un proveedor con el cuit ingresado");
		}
		
		if (ServiciosRemitoProveedor.buscarRemitoProveedor(r) == null) {
			RemitoProveedor nuevoRemito = new RemitoProveedor(r.getNumeroRemito(), r.getFechaEmision(), r.getFechaEntrega(), prov);
			
			for (ItemRemitoVO item : r.getItemsRemito()) {
				ProductoVO p = item.getProducto();
				RodamientoVO rod = p.getRodamiento();
				String codigoRodamiento = rod.getCodigo();
				String sufijoRodamiento = rod.getSufijo();
				String fabricante = p.getFabricante().getNombre();
				String paisOrigen = p.getOrigen().getNombre();
				Integer cantidad = item.getCantidad();
				
				if (codigoRodamiento == null || paisOrigen == null || fabricante == null || cantidad == null) {
					throw new Exception("ERROR - Cuit, numero de remito, codigo de rodamiento, pais de origen, fabricante y cantidad son requeridos.");
				}
				
				Producto prodRecibido = ServiciosProducto.buscarProducto(codigoRodamiento, sufijoRodamiento, paisOrigen, fabricante);
				if (prodRecibido == null) {
					throw new Exception("ERROR - No existe un producto con codigo/sufijo/origen/fabricante ingresados.");
				}
				
				//Creaar y agregar el item
				nuevoRemito.agregarItem(prodRecibido, cantidad, null);
				
				//Actualizar el stock del producto
				int cantidadRecibida = cantidad;
				prodRecibido.setStock(prodRecibido.getStock() + cantidadRecibida);
				AdministradorPersistencia.getInstancia().persistir(prodRecibido);
				
				//Cumplir ordenes de compra con los items recibidos
				List<ItemOrdenCompra> itemsOrden = OrdenCompraDAO.getInstancia().obtenerItemsOrdenDeCompraNoCumplidosParaProductoRecibido(nuevoRemito.getProveedor(), prodRecibido);
				for (ItemOrdenCompra itemOrdenCompra : itemsOrden) {
					if (cantidadRecibida > 0) {
						cantidadRecibida -= itemOrdenCompra.agregarProductoRecibido(nuevoRemito, cantidadRecibida);
						AdministradorPersistencia.getInstancia().persistir(itemOrdenCompra);
					}
				}
				//TODO: verificar si la orden esta cumplida, y cambiarle el estado!
			}
			
			SistemaCVR.getInstancia().agregarEntidad(nuevoRemito);
		} else {
			throw new Exception("ERROR - Ya existe un remito para el proveedor/numero de remito ingresados.");	
		}
	}
}
